#lang clotho/racket/base
;; -*- mode: Racket -*-
;;
;; Copyright (c) 2017-2020 The University of Utah
;; All rights reserved.
;;
;; This file is part of Xsmith, a generator of highly effective fuzz testers.
;;
;; Redistribution and use in source and binary forms, with or without
;; modification, are permitted provided that the following conditions are met:
;;
;;   * Redistributions of source code must retain the above copyright notice,
;;     this list of conditions and the following disclaimer.
;;
;;   * Redistributions in binary form must reproduce the above copyright
;;     notice, this list of conditions and the following disclaimer in the
;;     documentation and/or other materials provided with the distribution.
;;
;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
;; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
;; ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
;; CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
;; ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
;; POSSIBILITY OF SUCH DAMAGE.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(provide
 assemble-spec-components
 (all-from-out "core-properties.rkt")
 (except-out (all-from-out "grammar-macros.rkt")
             assemble-spec-components/core)
 )

(require
 "grammar-macros.rkt"
 "core-properties.rkt"
 (submod "core-properties.rkt" for-private)
 syntax/parse/define
 (for-syntax
  clotho/racket/base
  ))

(define-syntax-parser assemble-spec-components
  [(_ spec:id
      (~optional (~seq #:properties (prop-name:id ...)))
      component ...)
   (with-syntax ([(prop-name ...) (or (attribute prop-name)
                                      '())])
     #'(assemble-spec-components/core
        spec
        (
         ;; Default properties
         depth-increase
         serialize
         fresh
         choice-filters-to-apply
         may-be-generated
         choice-weight
         child-node-name-dict
         wont-over-deepen
         introduces-scope
         binder-info
         reference-info
         reference-choice-info
         binder-info
         lift-predicate
         lift-type->ast-binder-type
         binding-structure
         mutable-container-access
         io
         strict-child-order?
         render-node-info
         render-hole-info
         type-info
         edit
         ;; user-added props
         prop-name ...
         )
        component ...))])

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; End of file.
